package dao

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"io/ioutil"
	"os"
)

// 全局变量
var RootPath string

// LocalConfig 本地存储配置结构体
type LocalConfig struct {
	RootPath string `yaml:"rootPath"`
}

// 初始化 Local 配置
func InitLocal() error {
	var c LocalConfig
	// 获取配置信息
	c.getLocalConfig()

	// 构建 OSS 客户端
	rootpath := c.RootPath
	RootPath = rootpath

	// 验证 OSS 客户端连接
	if err := pingLocal(rootpath); err != nil {
		return err
	}

	// 返回配置信息
	return nil
}

// 获取 OSS 配置信息
func (c *LocalConfig) getLocalConfig() *LocalConfig {
	// 读取 configs/application.yaml 文件
	yamlFile, err := ioutil.ReadFile("configs/application.yaml")
	if err != nil {
		fmt.Println(err.Error())
		return c
	}

	// 定义一个中间结构体来解析嵌套的 fileStorage 层
	type fileStorage struct {
		Local LocalConfig `yaml:"local"`
	}

	type config struct {
		FileStorage fileStorage `yaml:"fileStorage"`
	}

	var cfg config
	// 将读取的内容解析到中间结构体中
	err = yaml.Unmarshal(yamlFile, &cfg)
	if err != nil {
		fmt.Println(err.Error())
		return c
	}

	// 将解析后的配置赋值给当前的 ossConf 结构体
	*c = cfg.FileStorage.Local
	return c
}

// 验证 Local 连接
func pingLocal(rootpath string) error {
	//判断rootpath 路径是否存在，不存在则创建，若不存在的情况创建失败则返回error
	if _, err := os.Stat(rootpath); os.IsNotExist(err) {
		err := os.MkdirAll(rootpath, os.ModePerm)
		if err != nil {
			return err
		}
	}
	return nil
}
